

#ifndef PID_H
#define PID_H

#include "main.h"

enum PID_MODE
{
	PID_POSITION = 0,
	PID_DELTA
};

typedef struct 
{
	uint8_t mode;
	//PID 三参数
	double Kp;
	double Ki;
	double Kd;

	double max_out;  //最大输出
	double max_iout; //最大积分输出

	double set;
	double fdb;

	double out;
	double Pout;
	double Iout;
	double Dout;
	double Dbuf[3];  //微分项 0最新 1上一次 2上上次
	double error[3]; //误差项 0最新 1上一次 2上上次
} pid_type_def;


  /**
	* @brief          pid struct data init
	* @param[out]     pid: PID结构数据指针
	* @param[in]      mode: PID_POSITION:普通PID
	*                 PID_DELTA: 差分PID
	* @param[in]      PID: 0: kp, 1: ki, 2:kd
	* @param[in]      max_out: pid最大输出
	* @param[in]      max_iout: pid最大积分输出
	* @retval         none
	*/

extern void PID_init(pid_type_def *pid, uint8_t mode, const double PID[3], double max_out, double max_iout);//


/**
  * @brief          pid计算
  * @param[out]     pid: PID结构数据指针
  * @param[in]      ref: 反馈数据
  * @param[in]      set: 设定值
  * @retval         pid输出
  */
extern double PID_calc(pid_type_def *pid, double ref, double set);//


  /**
	* @brief          pid 输出清除
	* @param[out]     pid: PID结构数据指针
	* @retval         none
	*/
extern void PID_clear(pid_type_def *pid);
#endif

